Skip to content

add mnnvl pipeline using gb200 nodes - #873

Open
RJ Souza (Empyreus) wants to merge 53 commits into
mainfrom
rjsouza/gb200-ci
Open

add mnnvl pipeline using gb200 nodes#873
RJ Souza (Empyreus) wants to merge 53 commits into
mainfrom
rjsouza/gb200-ci

Conversation

@Empyreus

Copy link
Copy Markdown
Contributor

Add pipeline that runs on gb200 nodes, this allows for testing of mnnvl functionality and performance.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a GB200 MNNVL Azure pipeline for deployment, unit testing, and collective benchmarking.

Changes:

  • Adds GB200 deployment and test templates.
  • Adds GB200 benchmark tuning support.
  • Introduces proxy SSH, IMEX, and multi-architecture image handling.

Reviewed changes

Copilot reviewed 9 out of 10 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
test/deploy/setup.sh Formatting-only updates.
test/deploy/run-remote.sh Adds proxy SSH and optional library-path setup.
test/deploy/deploy.sh Adds pilot, proxy, IMEX, and AppArmor handling.
python/mscclpp_benchmark/tuning_config.py Recognizes GB200 GPUs.
python/mscclpp_benchmark/bench_collective.py Enables NVLS candidates for GB200.
docker/build.sh Revises multi-architecture manifest instructions.
.azure-pipelines/templates/ut-gb200.yml Adds GB200 unit-test workflows.
.azure-pipelines/templates/deploy.yml Adds pilot deployment support.
.azure-pipelines/multi-nodes-test.yml Formatting-only update.
.azure-pipelines/mnnvl-test.yml Adds the MNNVL pipeline.
Suppressed comments (2)

test/deploy/deploy.sh:107

  • This now adds the GB200 IMEX device to every CUDA deployment, including the existing H100/A100 jobs that share this script. Docker rejects --device when the host path does not exist, so those pipelines will fail at container creation. Gate this option to the GB200 deployment (and ensure that flag is passed correctly) while retaining plain --gpus=all elsewhere.
  LAUNCH_OPTION="--gpus=all --device /dev/nvidia-caps-imex-channels/channel0"

test/deploy/deploy.sh:120

  • The AppArmor workaround described above is GB200/kernel-specific, but this applies apparmor=unconfined to every default CUDA and ROCm test container. That unnecessarily removes AppArmor isolation from unrelated CI jobs. Scope the option to the affected GB200 deployment instead of changing the security profile globally.
  SECURITY_OPTION="--security-opt apparmor=unconfined"

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

targetType: filePath
filePath: test/deploy/deploy.sh
arguments: ${{ parameters.deployArgs }} ${{ parameters.containerName }} ${{ parameters.sglangImage }}
arguments: ${{ parameters.deployArgs }} ${{ parameters.containerName }} ${{ parameters.sglangImage }} ${{ parameters.pilot }}
Comment thread test/deploy/deploy.sh
Comment on lines +39 to +43
SSH_EXTRA_ARGS="-i ${KeyFilePath}"
if [ -n "${SSH_PROXY_JUMP:-}" ]; then
PROXY_KEY_OPT=""
[ -n "${SSH_PROXY_KEY:-}" ] && PROXY_KEY_OPT="-i ${SSH_PROXY_KEY} "
SSH_EXTRA_ARGS="${SSH_EXTRA_ARGS} -o ProxyCommand=\"ssh ${PROXY_KEY_OPT}-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p ${SSH_PROXY_JUMP}\""
- name: hostfile
type: string
default: '$(System.DefaultWorkingDirectory)/test/deploy/hostfile'
# Container-side hostfile passed to mpirun (one ip per line).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revert this change?

Comment thread test/deploy/setup.sh

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revert this one?

Comment thread test/deploy/run-remote.sh
if $USE_DOCKER; then
INNER="set -euxo pipefail;"
INNER+=" cd /root/mscclpp;"
INNER+=" [ -f /root/mscclpp/.ldpath ] && source /root/mscclpp/.ldpath;"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why need this?

Comment on lines +74 to +101
- task: Bash@3
displayName: Generate deploy files
inputs:
targetType: 'inline'
script: |
set -e
DEPLOY_DIR="$(System.DefaultWorkingDirectory)/test/deploy"
# First NVLink pair (2 nodes) from hostEntries; use $1 (the IP) so the
# names resolve inside the container too (the DSM hostnames are only in
# the agent's /etc/hosts). Bump to more nodes by parsing further lines.
NODE0=$(awk 'NF>=2{print $1; exit}' <<< "${{ parameters.hostEntries }}")
NODE1=$(awk 'NF>=2{c++} c==2{print $1; exit}' <<< "${{ parameters.hostEntries }}")

echo "Host ${NODE0}
Port 22345
IdentityFile /root/mscclpp/sshkey
StrictHostKeyChecking no
Host ${NODE1}
Port 22345
IdentityFile /root/mscclpp/sshkey
StrictHostKeyChecking no" > "${DEPLOY_DIR}/config"

printf '%s\n%s\n' "azhpcuser@${NODE0}" "azhpcuser@${NODE1}" > "${DEPLOY_DIR}/hostfile"

printf '%s\n%s\n' "${NODE0}" "${NODE1}" > "${DEPLOY_DIR}/hostfile_mpi"

# Publish the head node so the run steps can target it without hardcoding.
echo "##vso[task.setvariable variable=headNode]${NODE0}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We use only 2 nodes here? But provide 4 nodes?

displayName: Run Collective Benchmarks
runRemoteArgs: '--hostfile $(System.DefaultWorkingDirectory)/test/deploy/hostfile --host $(headNode) --user azhpcuser'
remoteScript: |
mpirun --allow-run-as-root --bind-to numa -hostfile /root/mscclpp/test/deploy/hostfile_mpi -mca btl_tcp_if_include 10.0.5.0/24 -np 8 -npernode 4 \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we not hard code 10.0.5.0/24?

# and MultiProcessTest.* (Prelim / HostName / HostHash).
- name: crossNodeFilter
type: string
default: '-Communicator,Executor,Ib,MemoryChannel,PortChannel,SemaphorePerf,SwitchChannel,TimeoutWithId'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why exclude MemoryChannel,PortChannel,SemaphorePerf,SwitchChannel?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants